package com.qfedu.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qfedu.dao.PermissionRepository;
import com.qfedu.dao.RolePermissionMapper;
import com.qfedu.dao.RolePermissionRepository;
import com.qfedu.dao.RoleRepository;
import com.qfedu.pojo.entity.Permission;
import com.qfedu.pojo.entity.Role;
import com.qfedu.pojo.entity.RolePermission;
import com.qfedu.pojo.req.RolePermissionReq;
import com.qfedu.pojo.req.RoleReq;
import com.qfedu.pojo.resp.BasePerDataResp;
import com.qfedu.pojo.resp.BasePerValueResp;
import com.qfedu.pojo.resp.BaseResp;
import com.qfedu.service.RoleService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    RoleRepository roleRepository;

    @Autowired
    PermissionRepository permissionRepository;

    @Autowired
    RolePermissionRepository rolePermissionRepository;

    @Autowired
    RolePermissionMapper rolePermissionMapper;

    @Override
//    Integer page, Integer size
    public BaseResp findAllRole(Integer page, Integer size) {
//        //1.在执行全查之前开启分页
//        PageHelper.startPage(page, size);
//        //2.执行全查操作
//        List<Role> roles = roleRepository.findAll();
//        //3.将查询结果放入分页对象中完成分页操作
//        PageInfo<Role> adminPageInfo = new PageInfo<>(roles);
//        return new BaseResp(1, "查询成功", adminPageInfo.getList(), adminPageInfo.getTotal());

        PageRequest of = PageRequest.of(page - 1, size);
        Page<Role> roles = roleRepository.findAll(of);
        return new BaseResp(1,"查询成功",roles.getContent(),roles.getTotalElements());
    }

    @Override
    public BaseResp addOrUpdRole(RoleReq roleReq) {
        Role role = new Role();
        //将RoleReq中接收的请求参数复制到role实体类中
        BeanUtils.copyProperties(roleReq, role);
        roleRepository.saveAndFlush(role);
        return new BaseResp(1, "更新成功！", null, null);
    }

    @Override
    public BaseResp delRole(RoleReq roleReq) {
        roleRepository.deleteById(roleReq.getId());
        return new BaseResp(1, "更新成功！", null, null);
    }

    /**
     * 该方法做三件事：
     * 1.查询出全部的权限信息
     * 2.查询出角色所拥有的权限id
     * 3.将查询出的两个结果分别封装在两个集合中并最终封装在BasePerValueResp返回值实体中
     * @param id
     * @return
     */
    @Override
    public BaseResp findAllPerAndRolePer(int id) {
        //1.查询出全部的权限信息
        List<Permission> permissions = permissionRepository.findAll();
        //定义BasePerDataResp集合，将查询到的信息全部遍历放入BasePerDataResp集合中
        List<BasePerDataResp> perData = new ArrayList<>();
        for (Permission li: permissions
        ) {
            //定义BasePerDataResp对象，因为每遍历一次都要一个新的对象存储查询到的权限信息
            BasePerDataResp basePerDataResp = new BasePerDataResp();
            basePerDataResp.setKey(li.getId());
            basePerDataResp.setLabel(li.getPermissionName());
            //代表权限可以被选中
            basePerDataResp.setDisabled(false);
            perData.add(basePerDataResp);
        }
        //2.查询出角色所拥有的权限id
        List<Integer> perValue = permissionRepository.selectPerIdByRoleId(id);
        //3.将查询出的两个结果分别封装在两个集合中并最终封装在BasePerValueResp返回值实体中
        //该实体中存放的是所有权限信息以及角色所拥有的权限id
        BasePerValueResp basePerValueResp = new BasePerValueResp();
        basePerValueResp.setData(perData);
        basePerValueResp.setValue(perValue);
        return new BaseResp(1, "success", basePerValueResp, null);
    }

    /**
     * 该方法用于向角色进行授权操作
     * 该方法作两件事：
     * 1.通过角色id去中间表中查询该角色是否拥有权限
     * 2.如果角色拥有权限则清空该角色在中间表中建立的所有关联关系然后建立新的关系，如果没有权限则直接建立新的关联关系
     * @param rolePermissionReq
     * @return
     */
    @Override
    public BaseResp updRolePermission(RolePermissionReq rolePermissionReq) {
        //首先从RolePermissionReq类中获取两个参数
        //角色id
        Integer roleId = rolePermissionReq.getRoleId();
        //权限id的集合
        List<Integer> perIdList = rolePermissionReq.getPerIdList();
//        1.通过角色id去中间表中查询该角色是否拥有权限
        List<RolePermission> rolePermissions = rolePermissionRepository.findByroleId(roleId);
        //2.开始判断该角色是否在角色权限表中跟权限绑定了关系
        if(rolePermissions != null) {   //说明该表中角色与权限有绑定关系
            //清空该角色下的绑定关系
            rolePermissionMapper.deleteRolePermission(roleId);
        }
        //角色下面没有绑定权限的情况，也就是通过id权限的情况
        //建立新的角色与权限的关联关系，前提是权限的集合必须不为空的情况下
        if(perIdList != null && perIdList.size() > 0) {
            //将角色id和权限的id传入，建立新的绑定关系
            rolePermissionMapper.insertRolePermission(rolePermissionReq);
        }
        return new BaseResp(1, "授权成功！", null, null);
    }
}
